2307
13602
Wat is de snelste methode om een ​​java.nio.ByteBuffer a om te zetten in een (nieuw aangemaakte) CharBuffer b of char [] b.
Hierbij is het belangrijk dat a [i] == b [i]. Dit betekent dat niet a [i] en a [i + 1] samen een waarde b [j] vormen, wat getChar (i) zou doen, maar de waarden zouden "spread" moeten zijn.
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // elk een byte (die zijn ondertekend)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // elk een char (die niet getekend zijn)
Merk op dat byte: -128 dezelfde (lagere 8) bits heeft als char: 128. Daarom neem ik aan dat de "beste" interpretatie zou zijn zoals ik hierboven heb opgemerkt, omdat de bits hetzelfde zijn.
Daarna heb ik ook de vice versa vertaling nodig: de meest efficiënte manier om een ​​char [] of java.nio.CharBuffer terug te krijgen in een java.nio.ByteBuffer. 
Dus wat u wilt, is converteren met de codering ISO-8859-1.
Ik beweer niets over efficiëntie, maar het is in ieder geval vrij kort om te schrijven:
CharBuffer resultaat = Charset.forName ("ISO-8859-1"). Decoderen (byteBuffer);
De andere richting zou zijn:
ByteBuffer resultaat = Charset.forName ("ISO-8859-1"). Encode (charBuffer);
Meet dit a.u.b. af met andere oplossingen. (Om eerlijk te zijn, mag het gedeelte Charset.forName niet worden opgenomen, en moet het ook maar één keer worden gedaan, niet voor elke buffer opnieuw.)
Vanaf Java 7 is er ook de klasse StandardCharsets met vooraf geïnstantieerde Charset-instanties, zodat u deze kunt gebruiken
CharBuffer resultaat = StandardCharsets.ISO_8859_1.decode (byteBuffer);
en
ByteBuffer resultaat = StandardCharsets.ISO_8859_1.encode (charBuffer);
in plaats daarvan. (Deze regels doen hetzelfde als de vorige, alleen het opzoeken is eenvoudiger en er is geen risico dat de namen verkeerd worden getypt, en het is niet nodig om de onmogelijke uitzonderingen op te vangen.)
|
Ik ben het eens met @ Ishtar's, stel voor om helemaal niet naar een nieuwe structuur te converteren en alleen te converteren als je het nodig hebt.
Als je echter een hoop ByteBuffer hebt, kun je dat doen.
ByteBuffer bb = ...
byte [] array = bb.array ();
char [] chars = new char [bb.remaining ()];
voor (int i = 0; i